package Persistencia;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

import Dominio.ApuestaData;

class ApuestaDAO {
	
	public static void create(ApuestaData bet) throws PersistenciaException{
		String local = bet.get_local();
		String visit = bet.get_visitante();
		float r1 = bet.get_ratio1();
		float rx = bet.get_ratiox();
		float r2 = bet.get_ratio2();
		String fechaFin = bet.get_fechaFinString();
		Date fechaAct = Calendar.getInstance().getTime();
		int id = (int) ((Long)(Agente.getAgente().selectList("SELECT count(id) " +
				"FROM Apuesta;").get(0).get(0)) + 1);
		bet.set_id(id);
		bet.set_fechaCreacion(fechaAct);
		try{
			Agente.getAgente().insert("INSERT INTO Apuesta (id, deporte, local, visitante," +
				"r1, rx, r2, fechaCreacion, fechaFin, validado) VALUES ("+id+",'"+
				bet.get_tipoString()+"','"+local+"','"+visit+"',"+r1+","+rx+"," +
				r2+",'"+bet.get_fechaCreacionString()+"','"+fechaFin
				+"',"+false+")");
		} catch (PersistenciaException e){
			delete(bet);
			throw new PersistenciaException(e.getMessage());
		}	
	}
	
	public static boolean delete(ApuestaData bet) throws PersistenciaException{
		return delete(bet.get_id());
	}
	
	public static boolean delete(int id) throws PersistenciaException{
		if(!Agente.getAgente().delete("DELETE FROM Apuesta WHERE id = "+id)) return false;
		return true;
	}
	
	public static ApuestaData read(int id) throws PersistenciaException{
		ApuestaData ret = null;
		String consulta = "SELECT deporte, local, visitante, r1, rx, r2, fechaCreacion," +
				"fechaFin, validado FROM Apuesta WHERE id = " + id;
		ArrayList<Object> tupla = Agente.getAgente().selectList(consulta).get(0);
		if(tupla.isEmpty()) throw new PersistenciaException("No existe la apuesta");
		else{ //Existe la apuesta
			String deporte = (tupla.get(0) != null ? (String)tupla.get(0) : "");
			String local = (tupla.get(1) != null ? (String)tupla.get(1) : "");
			String visitante = (tupla.get(2) != null ? (String)tupla.get(2) : "");
			float r1 = (tupla.get(3) != null ? (Float)tupla.get(3) : 0.0f);
			float rx = (tupla.get(4) != null ? (Float)tupla.get(4) : 0.0f);
			float r2 = (tupla.get(5) != null ? (Float)tupla.get(5) : 0.0f);
			String fC = (tupla.get(6) != null ? (String)tupla.get(6).toString() : "");
			String fF = (tupla.get(7) != null ? (String)tupla.get(7).toString() : "");
			boolean validado = (tupla.get(8) != null ? (Boolean)tupla.get(8) : false);
			ret = new ApuestaData(id,deporte,local,visitante,r1,rx,r2,fC,fF,validado);
		}
		return ret;
	}
	
	public static ArrayList<ApuestaData> readAll() throws PersistenciaException{
		ArrayList<ApuestaData> ret = new ArrayList<ApuestaData>();
		String consulta = "SELECT id FROM Apuesta WHERE validado = false ORDER BY fechaFin";
		ArrayList<ArrayList<Object>> result = Agente.getAgente().selectList(consulta);
		Iterator<ArrayList<Object>> it = result.iterator();
		while(it.hasNext()){
			ret.add(read((Integer)it.next().get(0)));
		}
		return ret;
	}
	
	public static boolean update(ApuestaData bet) throws PersistenciaException{
		ApuestaData aux = read(bet.get_id());
		ArrayList<String> columUpdate = new ArrayList<String>();
		ArrayList<String> valueUpdate = new ArrayList<String>();
		diferencias(bet, aux, columUpdate, valueUpdate);
		String update = "UPDATE Apuesta SET ";
		String set = "";
		String where = "WHERE id = "+bet.get_id();
		Iterator<String> itColum = columUpdate.iterator();
		Iterator<String> itValue = valueUpdate.iterator();
		while(itColum.hasNext()){
			set += itColum.next() + " = " + itValue.next();
			if(itColum.hasNext()) set += ", ";
		}
		if(set.length() > 0)
			if(!Agente.getAgente().update(update+set+" "+where)) return false;
		return true;
	}
	
	private static void diferencias(ApuestaData bet, ApuestaData aux,
			ArrayList<String> columUpdate, ArrayList<String> valueUpdate){
		if(bet.get_tipo() != aux.get_tipo()){
			columUpdate.add("deporte");
			valueUpdate.add("'"+bet.get_tipoString()+"'");
		}
		if(!bet.get_local().equalsIgnoreCase(aux.get_local())){
			columUpdate.add("local");
			valueUpdate.add("'"+bet.get_local()+"'");
		}
		if(!bet.get_visitante().equalsIgnoreCase(aux.get_visitante())){
			columUpdate.add("visitante");
			valueUpdate.add("'"+bet.get_visitante()+"'");
		}
		if(bet.get_ratio1() != aux.get_ratio1()){
			columUpdate.add("r1");
			valueUpdate.add(String.valueOf(bet.get_ratio1()));
		}
		if(bet.get_ratiox() != aux.get_ratiox()){
			columUpdate.add("rx");
			valueUpdate.add(String.valueOf(bet.get_ratiox()));
		}
		if(bet.get_ratio2() != aux.get_ratio2()){
			columUpdate.add("r2");
			valueUpdate.add(String.valueOf(bet.get_ratio2()));
		}
		if(!bet.get_fechaFinString().equalsIgnoreCase(aux.get_fechaFinString())){
			columUpdate.add("fechaFin");
			valueUpdate.add("'"+bet.get_fechaFinString()+"'");
		}
		if(bet.is_validado() != aux.is_validado()){
			columUpdate.add("validado");
			valueUpdate.add(String.valueOf(bet.is_validado()));
		}
	}
}
